package com.example.translateappjava.Activity.HomeFragmentActivity.Forum;

import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView; // 用于修改分类标签文本
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import com.example.translateappjava.Adapter.PostAdapter;
import com.example.translateappjava.R;
import com.example.translateappjava.Service.ForumApiService.ApiClient;
import com.example.translateappjava.Service.ForumApiService.ApiService;
import com.example.translateappjava.Utils.MockDataUtil;
import com.example.translateappjava.Utils.Post;

import java.util.ArrayList;
import java.util.List;

import retrofit2.Call; // 新增
import retrofit2.Callback; // 新增
import retrofit2.Response; // 新增

public class ForumFragment extends Fragment {

    private static final String TAG = "ForumFragment";
    private static final String MOCK_DATA_FILE = "mock_posts_health.json";

    private RecyclerView recyclerPosts;
    private PostAdapter postAdapter;
    private List<Post> postList; // 这个列表会先填充mock数据，然后尝试用后端数据替换

    // 分类标签视图
    private TextView categoryAll, categoryRecipes, categoryDiary, categoryScience, categoryShare; // 修改变量名和类型
    private View currentSelectedCategoryView; // 用于记录当前选中的View，方便改背景
    private String currentSelectedCategoryName = "全部"; // 用于网络请求

    private ApiService apiService; // 新增

    public static ForumFragment newInstance() {
        return new ForumFragment();
    }

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
                             @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.forum_layout, container, false); // 确保你的forum_layout.xml有对应ID
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        apiService = ApiClient.getClient().create(ApiService.class); // 初始化ApiService
        initViews(view);
        setupRecyclerView();
        setupCategories();

        // 1. 默认加载Mock数据
        loadInitialData();
    }

    private void initViews(View view) {
        recyclerPosts = view.findViewById(R.id.recycler_posts);

        // 分类标签 - 假设你的布局文件中TextView的ID如下
        // 你需要修改 R.id.category_tech 等为新的ID，或者在XML中修改ID并对应
        categoryAll = view.findViewById(R.id.category_all); // 假设这个ID不变，代表“全部”
        categoryRecipes = view.findViewById(R.id.category_recipes); // 新ID: category_recipes
        categoryDiary = view.findViewById(R.id.category_diary);     // 新ID: category_diary
        categoryScience = view.findViewById(R.id.category_science); // 新ID: category_science
        categoryShare = view.findViewById(R.id.category_share);   // 新ID: category_share

        // 设置分类标签的文本 (确保你的TextView在XML中存在)
        // 这些TextView也需要有背景 drawable (category_normal_bg, category_selected_bg)
        if (categoryAll != null) categoryAll.setText("全部");
        if (categoryRecipes != null) categoryRecipes.setText("营养食谱");
        if (categoryDiary != null) categoryDiary.setText("饮食日记");
        if (categoryScience != null) categoryScience.setText("健康科普");
        if (categoryShare != null) categoryShare.setText("经验分享");

        currentSelectedCategoryView = categoryAll; // 默认选中“全部”

        view.findViewById(R.id.btn_search).setOnClickListener(v -> onSearchClick());
        view.findViewById(R.id.btn_add).setOnClickListener(v -> onAddClick());
    }

    private void setupRecyclerView() {
        postList = new ArrayList<>();
        postAdapter = new PostAdapter(postList, this::onPostClick); // PostAdapter的构造函数可能需要调整
        recyclerPosts.setLayoutManager(new LinearLayoutManager(getContext()));
        recyclerPosts.setAdapter(postAdapter);
    }

    private void setupCategories() {
        // 为每个分类标签设置点击监听
        // "全部" -> null 或 "all" 给后端
        // "营养食谱" -> "营养食谱" (或后端约定的英文标识如 "recipes")
        if (categoryAll != null) categoryAll.setOnClickListener(v -> selectCategory(categoryAll, "全部", "all"));
        if (categoryRecipes != null) categoryRecipes.setOnClickListener(v -> selectCategory(categoryRecipes, "营养食谱", "营养食谱"));
        if (categoryDiary != null) categoryDiary.setOnClickListener(v -> selectCategory(categoryDiary, "饮食日记", "饮食日记"));
        if (categoryScience != null) categoryScience.setOnClickListener(v -> selectCategory(categoryScience, "健康科普", "健康科普"));
        if (categoryShare != null) categoryShare.setOnClickListener(v -> selectCategory(categoryShare, "经验分享", "经验分享"));

        // 初始选中“全部”的样式
        if (categoryAll != null) {
            categoryAll.setBackgroundResource(R.drawable.category_selected_bg);
            // ((TextView) categoryAll).setTextColor(getResources().getColor(R.color.selected_text_color)); // 示例
        }
    }

    private void loadInitialData() {
        // 1. 显示Mock数据
        List<Post> mockPosts = MockDataUtil.loadMockPosts(requireContext(), MOCK_DATA_FILE);
        updatePostList(mockPosts, false); // false表示不清除旧数据，因为这是初始加载

        // 2. 尝试从服务器获取数据
        fetchPostsFromServer(currentSelectedCategoryName.equals("全部") ? null : currentSelectedCategoryName, true);
    }

    private void selectCategory(View categoryView, String displayName, String categoryQueryName) {
        if (currentSelectedCategoryView == categoryView) return; // 如果点击的是当前已选中的，则不操作

        // 重置之前选中的分类样式
        if (currentSelectedCategoryView != null) {
            currentSelectedCategoryView.setBackgroundResource(R.drawable.category_normal_bg);
            // if (currentSelectedCategoryView instanceof TextView) {
            // ((TextView) currentSelectedCategoryView).setTextColor(getResources().getColor(R.color.normal_text_color));
            // }
        }

        // 设置新选中的分类样式
        categoryView.setBackgroundResource(R.drawable.category_selected_bg);
        // if (categoryView instanceof TextView) {
        // ((TextView) categoryView).setTextColor(getResources().getColor(R.color.selected_text_color));
        // }
        currentSelectedCategoryView = categoryView;
        currentSelectedCategoryName = categoryQueryName; // 用于网络请求的分类名

        // 过滤数据：先显示对应分类的Mock数据，然后请求服务器
        List<Post> filteredMockPosts = MockDataUtil.filterMockPostsByCategory(requireContext(), MOCK_DATA_FILE, displayName);
        updatePostList(filteredMockPosts, true); // true表示清除旧数据并加载新的mock分类数据

        fetchPostsFromServer(categoryQueryName.equals("全部") ? null : categoryQueryName, true); // true表示从服务器获取并替换
    }

    /**
     * 从服务器获取帖子数据
     * @param category 查询的分类名，null或"all"表示所有分类
     * @param replaceExistingData true则替换当前列表数据，false则添加到现有数据（如果需要分页加载）
     */
    private void fetchPostsFromServer(String category, boolean replaceExistingData) {
        // TODO: 显示加载动画
        Log.d(TAG, "Fetching posts for category: " + (category == null ? "all" : category));

        Call<List<Post>> call;
        if (category == null || "all".equalsIgnoreCase(category) || "全部".equalsIgnoreCase(category)) {
            call = apiService.getAllPosts(); // 假设有这个接口
        } else {
            call = apiService.getPosts(category);
        }

        // 如果你的ApiService只有一个 getPosts(@Query("category") String category)
        // 并且当category为null时后端能返回所有，那么可以这样：
        // Call<List<Post>> call = apiService.getPosts( (category == null || "all".equalsIgnoreCase(category) || "全部".equalsIgnoreCase(category)) ? null : category);


        call.enqueue(new Callback<List<Post>>() {
            @Override
            public void onResponse(@NonNull Call<List<Post>> call, @NonNull Response<List<Post>> response) {
                // TODO: 隐藏加载动画
                if (response.isSuccessful() && response.body() != null && !response.body().isEmpty()) {
                    Log.d(TAG, "Successfully fetched posts from server. Count: " + response.body().size());
                    updatePostList(response.body(), replaceExistingData);
                } else if (response.isSuccessful() && (response.body() == null || response.body().isEmpty())) {
                    Log.d(TAG, "Server responded successfully but no posts found for category: " + category);
                    if (replaceExistingData) { // 如果是替换模式且服务器没数据，可以清空或显示“无内容”
                        updatePostList(new ArrayList<>(), true); // 清空列表
                        // 或者保留mock数据，取决于你的策略
                    }
                    // 如果保留mock数据，这里就不做任何操作
                }
                else {
                    Log.e(TAG, "Failed to fetch posts. Code: " + response.code() + ", Message: " + response.message());
                    // 保留Mock数据，或者显示错误提示
                }
            }

            @Override
            public void onFailure(@NonNull Call<List<Post>> call, @NonNull Throwable t) {
                // TODO: 隐藏加载动画
                Log.e(TAG, "Error fetching posts from server: " + t.getMessage(), t);
                // 网络请求失败，Mock数据会继续显示，可以给用户一个提示
                // Toast.makeText(getContext(), "网络请求失败，请稍后重试", Toast.LENGTH_SHORT).show();
            }
        });
    }

    /**
     * 更新 RecyclerView 的数据列表
     * @param newPosts 新的帖子列表
     * @param clearOldData 是否清除旧数据
     */
    private void updatePostList(List<Post> newPosts, boolean clearOldData) {
        if (clearOldData) {
            postList.clear();
        }
        if (newPosts != null && !newPosts.isEmpty()) {
            postList.addAll(newPosts);
        }
        // 如果列表为空，可以显示一个 "暂无帖子" 的视图 (可选)
        // emptyView.setVisibility(postList.isEmpty() ? View.VISIBLE : View.GONE);
        postAdapter.notifyDataSetChanged();
    }


    // 这个方法现在被 loadInitialData 和 selectCategory 中的逻辑取代
    // private void loadMockData() { ... } // 可以删掉或注释掉旧的loadMockData


    private void onPostClick(Post post) {
        if (getContext() instanceof ForumListener) {
            ((ForumListener) getContext()).onPostClick(post);
        }
    }

    private void onSearchClick() {
        if (getContext() instanceof ForumListener) {
            ((ForumListener) getContext()).onSearchClick();
        }
    }

    private void onAddClick() {
        if (getContext() instanceof ForumListener) {
            ((ForumListener) getContext()).onAddPostClick();
        }
    }

    public interface ForumListener {
        void onPostClick(Post post);
        void onSearchClick();
        void onAddPostClick();
    }

    public void refreshData() {
        // 刷新数据时，总是尝试从服务器获取最新的
        // 可以选择先显示对应分类的mock数据，提供更快的反馈
        String categoryToFetch = currentSelectedCategoryName.equals("全部") ? null : currentSelectedCategoryName;

        // 1. (可选) 快速显示当前分类的mock数据
        String displayCategory = "全部"; // 默认
        if (currentSelectedCategoryView == categoryRecipes) displayCategory = "营养食谱";
        else if (currentSelectedCategoryView == categoryDiary) displayCategory = "饮食日记";
        else if (currentSelectedCategoryView == categoryScience) displayCategory = "健康科普";
        else if (currentSelectedCategoryView == categoryShare) displayCategory = "经验分享";

        List<Post> mockPosts = MockDataUtil.filterMockPostsByCategory(requireContext(), MOCK_DATA_FILE, displayCategory);
        updatePostList(mockPosts, true);

        // 2. 然后从服务器拉取
        fetchPostsFromServer(categoryToFetch, true);
    }

    public void addPost(Post post) {
        // 当用户发帖成功后，新帖子会添加到列表顶部
        // 这里可以先在本地添加，然后（可选）通知后端
        if (post != null) {
            postList.add(0, post);
            postAdapter.notifyItemInserted(0);
            recyclerPosts.scrollToPosition(0);
        }
    }
}